/*
 * jQzoom Evolution Library v2.3  - Javascript Image magnifier
 * http://www.mind-projects.it
 *
 * Copyright 2011, Engineer Marco Renzi
 * Licensed under the BSD license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the organization nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * Date: 03 May 2011 22:16:00
 */
(function($) {
	var isIE6 = ($.browser.msie && $.browser.version < 7);
	var body = $(document.body);
	var window = $(window);
	var jqzoompluging_disabled = false;
	$.fn.jqzoom = function(options) {
		return this.each(function() {
			var node = this.nodeName.toLowerCase();
			if (node == "a") {
				new jqzoom(this, options)
			}
		})
	};
	jqzoom = function(el, options) {
		var api = null;
		api = $(el).data("jqzoom");
		if (api) {
			return api
		}
		var obj = this;
		var settings = $.extend({}, $.jqzoom.defaults, options || {});
		obj.el = el;
		el.rel = $(el).attr("rel");
		el.zoom_active = false;
		el.zoom_disabled = false;
		el.largeimageloading = false;
		el.largeimageloaded = false;
		el.scale = {};
		el.timer = null;
		el.mousepos = {};
		el.mouseDown = false;
		$(el).css({
			"outline-style" : "none",
			"text-decoration" : "none"
		});
		var img = $("img:eq(0)", el);
		el.title = $(el).attr("title");
		el.imagetitle = img.attr("title");
		var zoomtitle = ($.trim(el.title).length > 0) ? el.title
				: el.imagetitle;
		var smallimage = new Smallimage(img);
		var lens = new Lens();
		var stage = new Stage();
		var largeimage = new Largeimage();
		var loader = new Loader();
		$(el).bind("click", function(e) {
			e.preventDefault();
			return false
		});
		var zoomtypes = [ "standard", "drag", "innerzoom", "reverse" ];
		if ($.inArray($.trim(settings.zoomType), zoomtypes) < 0) {
			settings.zoomType = "standard"
		}
		$
				.extend(
						obj,
						{
							create : function() {
								if ($(".zoomPad", el).length == 0) {
									el.zoomPad = $("<div/>")
											.addClass("zoomPad");
									img.wrap(el.zoomPad)
								}
								if (settings.zoomType == "innerzoom") {
									settings.zoomWidth = smallimage.w;
									settings.zoomHeight = smallimage.h
								}
								if ($(".zoomPup", el).length == 0) {
									lens.append()
								}
								if ($(".zoomWindow", el).length == 0) {
									stage.append()
								}
								if ($(".zoomPreload", el).length == 0) {
									loader.append()
								}
								if (settings.preloadImages
										|| settings.zoomType == "drag"
										|| settings.alwaysOn) {
									obj.load()
								}
								obj.init()
							},
							init : function() {
								if (settings.zoomType == "drag") {
									$(".zoomPad", el).mousedown(function() {
										el.mouseDown = true
									});
									$(".zoomPad", el).mouseup(function() {
										el.mouseDown = false
									});
									document.body.ondragstart = function() {
										return false
									};
									$(".zoomPad", el).css({
										cursor : "default"
									});
									$(".zoomPup", el).css({
										cursor : "move"
									})
								}
								if (settings.zoomType == "innerzoom") {
									$(".zoomWrapper", el).css({
										cursor : "crosshair"
									})
								}
								$(".zoomPad", el).bind("mouseenter mouseover",
										function(event) {
											img.attr("title", "");
											$(el).attr("title", "");
											el.zoom_active = true;
											smallimage.fetchdata();
											if (el.largeimageloaded) {
												obj.activate(event)
											} else {
												obj.load()
											}
										});
								$(".zoomPad", el).bind("mouseleave",
										function(event) {
											obj.deactivate()
										});
								$(".zoomPad", el)
										.bind(
												"mousemove",
												function(e) {
													if (e.pageX > smallimage.pos.r
															|| e.pageX < smallimage.pos.l
															|| e.pageY < smallimage.pos.t
															|| e.pageY > smallimage.pos.b) {
														lens.setcenter();
														return false
													}
													el.zoom_active = true;
													if (el.largeimageloaded
															&& !$(
																	".zoomWindow",
																	el).is(
																	":visible")) {
														obj.activate(e)
													}
													if (el.largeimageloaded
															&& (settings.zoomType != "drag" || (settings.zoomType == "drag" && el.mouseDown))) {
														lens.setposition(e)
													}
												});
								var thumb_preload = new Array();
								var i = 0;
								var thumblist = new Array();
								thumblist = $("a").filter(
										function() {
											var regex = new RegExp(
													"gallery[\\s]*:[\\s]*'"
															+ $.trim(el.rel)
															+ "'", "i");
											var rel = $(this).attr("rel");
											if (regex.test(rel)) {
												return this
											}
										});
								if (thumblist.length > 0) {
									var first = thumblist.splice(0, 1);
									thumblist.push(first)
								}
								thumblist
										.each(function() {
											if (settings.preloadImages) {
												var thumb_options = $
														.extend(
																{},
																eval("("
																		+ $
																				.trim($(
																						this)
																						.attr(
																								"rel"))
																		+ ")"));
												thumb_preload[i] = new Image();
												thumb_preload[i].src = thumb_options.largeimage;
												i++
											}
											$(this)
													.click(
															function(e) {
																if ($(this)
																		.hasClass(
																				"zoomThumbActive")) {
																	return false
																}
																thumblist
																		.each(function() {
																			$(
																					this)
																					.removeClass(
																							"zoomThumbActive")
																		});
																e
																		.preventDefault();
																obj
																		.swapimage(this);
																return false
															})
										})
							},
							load : function() {
								if (el.largeimageloaded == false
										&& el.largeimageloading == false) {
									var url = $(el).attr("href");
									el.largeimageloading = true;
									largeimage.loadimage(url)
								}
							},
							activate : function(e) {
								clearTimeout(el.timer);
								lens.show();
								stage.show()
							},
							deactivate : function(e) {
								switch (settings.zoomType) {
								case "drag":
									break;
								default:
									img.attr("title", el.imagetitle);
									$(el).attr("title", el.title);
									if (settings.alwaysOn) {
										lens.setcenter()
									} else {
										stage.hide();
										lens.hide()
									}
									break
								}
								el.zoom_active = false
							},
							swapimage : function(link) {
								el.largeimageloading = false;
								el.largeimageloaded = false;
								var options = new Object();
								options = $.extend({}, eval("("
										+ $.trim($(link).attr("rel")) + ")"));
								if (options.smallimage && options.largeimage) {
									var smallimage = options.smallimage;
									var largeimage = options.largeimage;
									$(link).addClass("zoomThumbActive");
									$(el).attr("href", largeimage);
									img.attr("src", smallimage);
									lens.hide();
									stage.hide();
									obj.load()
								} else {
									$("#midimg")
											.attr("src",
													"/wcsstore/GreeStorefrontAssetStore/images/blank.gif");
									$("#midimg").addClass("errImg");
									throw "ERROR :: Missing parameter for largeimage or smallimage."
								}
								return false
							}
						});
		if (img[0].complete) {
			smallimage.fetchdata();
			if ($(".zoomPad", el).length == 0) {
				obj.create()
			}
		}
		function Smallimage(image) {
			var $obj = this;
			this.node = image[0];
			this.findborder = function() {
				var bordertop = 0;
				bordertop = image.css("border-top-width");
				btop = "";
				var borderleft = 0;
				borderleft = image.css("border-left-width");
				bleft = "";
				if (bordertop) {
					for (i = 0; i < 3; i++) {
						var x = [];
						x = bordertop.substr(i, 1);
						if (isNaN(x) == false) {
							btop = btop + "" + bordertop.substr(i, 1)
						} else {
							break
						}
					}
				}
				if (borderleft) {
					for (i = 0; i < 3; i++) {
						if (!isNaN(borderleft.substr(i, 1))) {
							bleft = bleft + borderleft.substr(i, 1)
						} else {
							break
						}
					}
				}
				$obj.btop = (btop.length > 0) ? eval(btop) : 0;
				$obj.bleft = (bleft.length > 0) ? eval(bleft) : 0
			};
			this.fetchdata = function() {
				$obj.findborder();
				$obj.w = image.width();
				$obj.h = image.height();
				$obj.ow = image.outerWidth();
				$obj.oh = image.outerHeight();
				$obj.pos = image.offset();
				$obj.pos.l = image.offset().left + $obj.bleft;
				$obj.pos.t = image.offset().top + $obj.btop;
				$obj.pos.r = $obj.w + $obj.pos.l;
				$obj.pos.b = $obj.h + $obj.pos.t;
				$obj.rightlimit = image.offset().left + $obj.ow;
				$obj.bottomlimit = image.offset().top + $obj.oh
			};
			this.node.onerror = function() {
				$("#midimg").attr("src",
						"/wcsstore/GreeStorefrontAssetStore/images/blank.gif");
				$("#midimg").addClass("errImg");
				throw "Problems while loading image."
			};
			this.node.onload = function() {
				$obj.fetchdata();
				if ($(".zoomPad", el).length == 0) {
					obj.create()
				}
			};
			return $obj
		}
		function Loader() {
			var $obj = this;
			this.append = function() {
				this.node = $("<div/>").addClass("zoomPreload").css(
						"visibility", "hidden").html(settings.preloadText);
				$(".zoomPad", el).append(this.node)
			};
			this.show = function() {
				this.node.top = (smallimage.oh - this.node.height()) / 2;
				this.node.left = (smallimage.ow - this.node.width()) / 2;
				this.node.css({
					top : this.node.top,
					left : this.node.left,
					position : "absolute",
					visibility : "visible"
				})
			};
			this.hide = function() {
				this.node.css("visibility", "hidden")
			};
			return this
		}
		function Lens() {
			var $obj = this;
			this.node = $("<div/>").addClass("zoomPup");
			this.append = function() {
				$(".zoomPad", el).append($(this.node).hide());
				if (settings.zoomType == "reverse") {
					this.image = new Image();
					this.image.src = smallimage.node.src;
					$(this.node).empty().append(this.image)
				}
			};
			this.setdimensions = function() {
				this.node.w = (parseInt((settings.zoomWidth) / el.scale.x) > smallimage.w) ? smallimage.w
						: (parseInt(settings.zoomWidth / el.scale.x));
				this.node.h = (parseInt((settings.zoomHeight) / el.scale.y) > smallimage.h) ? smallimage.h
						: (parseInt(settings.zoomHeight / el.scale.y));
				this.node.top = (smallimage.oh - this.node.h - 2) / 2;
				this.node.left = (smallimage.ow - this.node.w - 2) / 2;
				this.node.css({
					top : 0,
					left : 0,
					width : this.node.w + "px",
					height : this.node.h + "px",
					position : "absolute",
					display : "none",
					borderWidth : 1 + "px"
				});
				if (settings.zoomType == "reverse") {
					this.image.src = smallimage.node.src;
					$(this.node).css({
						"opacity" : 1
					});
					$(this.image).css({
						position : "absolute",
						display : "block",
						left : -(this.node.left + 1 - smallimage.bleft) + "px",
						top : -(this.node.top + 1 - smallimage.btop) + "px"
					})
				}
			};
			this.setcenter = function() {
				this.node.top = (smallimage.oh - this.node.h - 2) / 2;
				this.node.left = (smallimage.ow - this.node.w - 2) / 2;
				this.node.css({
					top : this.node.top,
					left : this.node.left
				});
				if (settings.zoomType == "reverse") {
					$(this.image).css({
						position : "absolute",
						display : "block",
						left : -(this.node.left + 1 - smallimage.bleft) + "px",
						top : -(this.node.top + 1 - smallimage.btop) + "px"
					})
				}
				largeimage.setposition()
			};
			this.setposition = function(e) {
				el.mousepos.x = e.pageX;
				el.mousepos.y = e.pageY;
				var lensleft = 0;
				var lenstop = 0;
				function overleft(lens) {
					return el.mousepos.x - (lens.w) / 2 < smallimage.pos.l
				}
				function overright(lens) {
					return el.mousepos.x + (lens.w) / 2 > smallimage.pos.r
				}
				function overtop(lens) {
					return el.mousepos.y - (lens.h) / 2 < smallimage.pos.t
				}
				function overbottom(lens) {
					return el.mousepos.y + (lens.h) / 2 > smallimage.pos.b
				}
				lensleft = el.mousepos.x + smallimage.bleft - smallimage.pos.l
						- (this.node.w + 2) / 2;
				lenstop = el.mousepos.y + smallimage.btop - smallimage.pos.t
						- (this.node.h + 2) / 2;
				if (overleft(this.node)) {
					lensleft = smallimage.bleft - 1
				} else {
					if (overright(this.node)) {
						lensleft = smallimage.w + smallimage.bleft
								- this.node.w - 1
					}
				}
				if (overtop(this.node)) {
					lenstop = smallimage.btop - 1
				} else {
					if (overbottom(this.node)) {
						lenstop = smallimage.h + smallimage.btop - this.node.h
								- 1
					}
				}
				this.node.left = lensleft;
				this.node.top = lenstop;
				this.node.css({
					"left" : lensleft + "px",
					"top" : lenstop + "px"
				});
				if (settings.zoomType == "reverse") {
					if ($.browser.msie && $.browser.version > 7) {
						$(this.node).empty().append(this.image)
					}
					$(this.image).css({
						position : "absolute",
						display : "block",
						left : -(this.node.left + 1 - smallimage.bleft) + "px",
						top : -(this.node.top + 1 - smallimage.btop) + "px"
					})
				}
				largeimage.setposition()
			};
			this.hide = function() {
				img.css({
					"opacity" : 1
				});
				this.node.hide()
			};
			this.show = function() {
				if (settings.zoomType != "innerzoom"
						&& (settings.lens || settings.zoomType == "drag")) {
					this.node.show()
				}
				if (settings.zoomType == "reverse") {
					img.css({
						"opacity" : settings.imageOpacity
					})
				}
			};
			this.getoffset = function() {
				var o = {};
				o.left = $obj.node.left;
				o.top = $obj.node.top;
				return o
			};
			return this
		}
		function Stage() {
			var $obj = this;
			this.node = $("<div class='zoomWindow'><div class='zoomWrapper'><div class='zoomWrapperTitle'></div><div class='zoomWrapperImage'></div></div></div>");
			this.ieframe = $('<iframe class="zoomIframe" src="javascript:\'\';" marginwidth="0" marginheight="0" align="bottom" scrolling="no" frameborder="0" ></iframe>');
			this.setposition = function() {
				this.node.leftpos = 0;
				this.node.toppos = 0;
				if (settings.zoomType != "innerzoom") {
					switch (settings.position) {
					case "left":
						this.node.leftpos = (smallimage.pos.l
								- smallimage.bleft - Math.abs(settings.xOffset)
								- settings.zoomWidth > 0) ? (0 - settings.zoomWidth - Math
								.abs(settings.xOffset))
								: (smallimage.ow + Math.abs(settings.xOffset));
						this.node.toppos = Math.abs(settings.yOffset);
						break;
					case "top":
						this.node.leftpos = Math.abs(settings.xOffset);
						this.node.toppos = (smallimage.pos.t - smallimage.btop
								- Math.abs(settings.yOffset)
								- settings.zoomHeight > 0) ? (0 - settings.zoomHeight - Math
								.abs(settings.yOffset))
								: (smallimage.oh + Math.abs(settings.yOffset));
						break;
					case "bottom":
						this.node.leftpos = Math.abs(settings.xOffset);
						this.node.toppos = (smallimage.pos.t - smallimage.btop
								+ smallimage.oh + Math.abs(settings.yOffset)
								+ settings.zoomHeight < screen.height) ? (smallimage.oh + Math
								.abs(settings.yOffset))
								: (0 - settings.zoomHeight - Math
										.abs(settings.yOffset));
						break;
					default:
						this.node.leftpos = (smallimage.rightlimit
								+ Math.abs(settings.xOffset)
								+ settings.zoomWidth < screen.width) ? (smallimage.ow + Math
								.abs(settings.xOffset))
								: (0 - settings.zoomWidth - Math
										.abs(settings.xOffset));
						this.node.toppos = Math.abs(settings.yOffset);
						break
					}
				}
				this.node.css({
					"left" : this.node.leftpos + "px",
					"top" : this.node.toppos + "px"
				});
				return this
			};
			this.append = function() {
				$(".zoomPad", el).append(this.node);
				this.node.css({
					position : "absolute",
					display : "none",
					zIndex : 5001
				});
				if (settings.zoomType == "innerzoom") {
					this.node.css({
						cursor : "default"
					});
					var thickness = (smallimage.bleft == 0) ? 1
							: smallimage.bleft;
					$(".zoomWrapper", this.node).css({
						borderWidth : thickness + "px"
					})
				}
				$(".zoomWrapper", this.node).css({
					width : Math.round(settings.zoomWidth) + "px",
					borderWidth : thickness + "px"
				});
				$(".zoomWrapperImage", this.node).css({
					width : "100%",
					height : Math.round(settings.zoomHeight) + "px"
				});
				$(".zoomWrapperTitle", this.node).css({
					width : "100%",
					position : "absolute"
				});
				$(".zoomWrapperTitle", this.node).hide();
				if (settings.title && zoomtitle.length > 0) {
					$(".zoomWrapperTitle", this.node).html(zoomtitle).show()
				}
				$obj.setposition()
			};
			this.hide = function() {
				switch (settings.hideEffect) {
				case "fadeout":
					this.node.fadeOut(settings.fadeoutSpeed, function() {
					});
					break;
				default:
					this.node.hide();
					break
				}
				this.ieframe.hide()
			};
			this.show = function() {
				switch (settings.showEffect) {
				case "fadein":
					this.node.fadeIn();
					this.node.fadeIn(settings.fadeinSpeed, function() {
					});
					break;
				default:
					this.node.show();
					break
				}
				if (isIE6 && settings.zoomType != "innerzoom") {
					this.ieframe.width = this.node.width();
					this.ieframe.height = this.node.height();
					this.ieframe.left = this.node.leftpos;
					this.ieframe.top = this.node.toppos;
					this.ieframe.css({
						display : "block",
						position : "absolute",
						left : this.ieframe.left,
						top : this.ieframe.top,
						zIndex : 99,
						width : this.ieframe.width + "px",
						height : this.ieframe.height + "px"
					});
					$(".zoomPad", el).append(this.ieframe);
					this.ieframe.show()
				}
			}
		}
		function Largeimage() {
			var $obj = this;
			this.node = new Image();
			this.loadimage = function(url) {
				loader.show();
				this.url = url;
				this.node.style.position = "absolute";
				this.node.style.border = "0px";
				this.node.style.display = "none";
				this.node.style.left = "-5000px";
				this.node.style.top = "0px";
				document.body.appendChild(this.node);
				this.node.src = url
			};
			this.fetchdata = function() {
				var image = $(this.node);
				var scale = {};
				this.node.style.display = "block";
				$obj.w = image.width();
				$obj.h = image.height();
				$obj.pos = image.offset();
				$obj.pos.l = image.offset().left;
				$obj.pos.t = image.offset().top;
				$obj.pos.r = $obj.w + $obj.pos.l;
				$obj.pos.b = $obj.h + $obj.pos.t;
				scale.x = ($obj.w / smallimage.w);
				scale.y = ($obj.h / smallimage.h);
				el.scale = scale;
				document.body.removeChild(this.node);
				$(".zoomWrapperImage", el).empty().append(this.node);
				lens.setdimensions()
			};
			this.node.onerror = function() {
				$("#midimg").attr("src","/wcsstore/GreeStorefrontAssetStore/images/blank.gif");
				$("#midimg").addClass("errImg");
				throw "Problems while loading the big image."
			};
			this.node.onload = function() {
				$obj.fetchdata();
				loader.hide();
				el.largeimageloading = false;
				el.largeimageloaded = true;
				if (settings.zoomType == "drag" || settings.alwaysOn) {
					lens.show();
					stage.show();
					lens.setcenter()
				}
			};
			this.setposition = function() {
				var left = -el.scale.x
						* (lens.getoffset().left - smallimage.bleft + 1);
				var top = -el.scale.y
						* (lens.getoffset().top - smallimage.btop + 1);
				$(this.node).css({
					"left" : left + "px",
					"top" : top + "px"
				})
			};
			return this
		}
		$(el).data("jqzoom", obj)
	};
	$.jqzoom = {
		defaults : {
			zoomType : "standard",
			zoomWidth : 300,
			zoomHeight : 300,
			xOffset : 10,
			yOffset : 0,
			position : "right",
			preloadImages : true,
			title : true,
			lens : true,
			imageOpacity : 0.4,
			alwaysOn : false,
			showEffect : "show",
			hideEffect : "hide",
			fadeinSpeed : "slow",
			fadeoutSpeed : "2000"
		},
		disable : function(el) {
			var api = $(el).data("jqzoom");
			api.disable();
			return false
		},
		enable : function(el) {
			var api = $(el).data("jqzoom");
			api.enable();
			return false
		},
		disableAll : function(el) {
			jqzoompluging_disabled = true
		},
		enableAll : function(el) {
			jqzoompluging_disabled = false
		}
	}
})(jQuery);